package office.document.core.domain;

import cn.hutool.core.util.ObjectUtil;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 表格提取
 *
 * @author: zhanglu
 * @date: 2023/7/29 15:02
 * @modify: 修改人信息, 修改内容 2023/7/29 15:02
 */
@Data
public class TableExtractDO {

    /**
     * 行数
     */
    private Integer rowCount;
    /**
     * 列数
     */
    private Integer columnCount;
    /**
     * 行数据 行号 + 列号 能够确定单元格位置
     */
    private List<Row> rows;

    /**
     * 单元格大小
     */
    private Map<Integer, Integer> columnSizeMap;

    /**
     * 添加单元格
     *
     * @param row 行
     * @return
     */
    public TableExtractDO addRow(Row row) {
        if (ObjectUtil.isEmpty(this.rows)) {
            this.rows = new ArrayList<>();
        }
        this.rows.add(row);
        return this;
    }

    /**
     * 添加单元格
     *
     * @param row       行
     * @param columnIdx 列号
     * @param text      单元格内容
     * @return
     */
    public TableExtractDO addColumn(Row row, Integer columnIdx, String text) {
        if (ObjectUtil.isEmpty(row.getColumns())) {
            row.setColumns(new ArrayList<>());
        }
        row.getColumns().add(new Column().setColumnIdx(columnIdx).setText(text));
        return this;
    }

    /**
     * 获取行列数据
     * @return List<行<list<列>>
     */
    public List<List<String>> getRowsColumns(){
        if(ObjectUtil.isEmpty(this.rows)){
            return new ArrayList<>();
        }
        return rows.stream().map(r -> r.getColumns().stream().map(Column::getText).collect(Collectors.toList())).collect(Collectors.toList());
    }

    /**
     * 获取单元格大小
     * @return  表格提取实体
     */
    public TableExtractDO setColumnSizes(Integer idx, Integer length) {
        if(ObjectUtil.isEmpty(this.columnSizeMap)){
            this.columnSizeMap = new LinkedHashMap<>();
        }
        if(!this.columnSizeMap.containsKey(idx)){
            this.columnSizeMap.put(idx, (ObjectUtil.isEmpty(length) || length == 0) ? 1 : length);
        } else if(this.columnSizeMap.get(idx) < length) {
            this.columnSizeMap.put(idx, (ObjectUtil.isEmpty(length) || length == 0) ? 1 : length);
        }
        return this;
    }

    /**
     * 行定义
     */
    @Data
    @Accessors(chain = true)
    public static class Row {
        /**
         * 列号
         */
        private Integer rowIdx;
        /**
         * 单元格数据
         */
        private List<Column> columns;

        public Row(Integer rowIdx) {
            this.rowIdx = rowIdx;
        }
    }

    /**
     * 列定义
     */
    @Data
    @Accessors(chain = true)
    public static class Column {
        /**
         * 列号
         */
        private Integer columnIdx;
        /**
         * 文本
         */
        private String text;
    }

}
